package server.db;

import org.apache.commons.dbutils.*;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class DBDriver {
    /**
     * DBUtils数据库查询操作
     *
     * @param sql    查询语句
     * @param rsh    返回结果集类型句柄，可以选择一下类型作为返回结果集的句柄
     *               ArrayHandler 将ResultSet转为一个Object[]的ResultSetHandler实现类
     *               ArrayListHandler 将ResultSet转换为List<Object[]>的ResultSetHandler实现类
     *               BeanHandler 将ResultSet行转换为一个JavaBean的ResultSetHandler实现类
     *               BeanListHandler 将ResultSet转换为List<JavaBean>的ResultSetHandler实现类（经常使用※）
     *               ColumnListHandler 将ResultSet的一个列转换为List<Object>的ResultSetHandler实现类
     *               KeyedHandler 将ResultSet转换为Map<Map>的ResultSetHandler实现类
     *               MapHandler 将ResultSet的首行转换为一个Map的ResultSetHandler实现类
     *               MapListHandler 将ResultSet转换为List<Map>的ResultSetHandler实现类
     *               ScalarHandler 将ResultSet的一个列到一个对象。
     * @param params 查询语句的参数
     * @return 查询结果集
     */
    public <T> T query(String sql, ResultSetHandler<T> rsh, Object... params) {
        // 返回值
        T tRe = null;
        try {
            // 创建dbutils的查询处理类 QueryRunner的实例对象
            QueryRunner qr = new QueryRunner(DBSource.getDataSource(), true);
            // 使用queryrunner进行查询操作
            tRe = qr.query(sql, rsh, params);
        } catch (SQLException e) {
            // DBUtils数据库查询操作异常
            System.out.println("DBUtils数据库查询操作异常:" + e.getMessage());
            e.printStackTrace();
        }
        // 返回结果集
        return tRe;
    }

    /**
     * DBUtils数据库新增、修改、删除操作
     *
     * @param sql    数据库新增、修改、删除操作语句
     * @param params 数据库新增、修改、删除操作语句的参数
     * @return 数据库新增、修改、删除操作所影响记录行数
     */
    public int update(String sql, Object... params) {
        // 返回值
        int iRe = 0;
        try {
            // 创建dbutils的更新处理类 QueryRunner的实例对象
            QueryRunner qr = new QueryRunner(DBSource.getDataSource(), true);
            // 使用queryrunner进行数据库新增、修改、删除操作
            iRe = qr.update(sql, params);
        } catch (SQLException e) {
            // DBUtils数据库新增、修改、删除操作异常
            System.out.println("DBUtils数据库新增、修改、删除操作异常:" + e.getMessage());
            e.printStackTrace();
        }
        // 返回结果集
        return iRe;
    }

    /**
     * DBUtils数据库查询操作(支持事务操作)
     *
     * @param conn   开启事务的数据库连接对象
     * @param sql    查询语句
     * @param rsh    返回结果集类型句柄，可以选择一下类型作为返回结果集的句柄
     *               ArrayHandler 将ResultSet转为一个Object[]的ResultSetHandler实现类
     *               ArrayListHandler 将ResultSet转换为List<Object[]>的ResultSetHandler实现类
     *               BeanHandler 将ResultSet行转换为一个JavaBean的ResultSetHandler实现类
     *               BeanListHandler 将ResultSet转换为List<JavaBean>的ResultSetHandler实现类（经常使用※）
     *               ColumnListHandler 将ResultSet的一个列转换为List<Object>的ResultSetHandler实现类
     *               KeyedHandler 将ResultSet转换为Map<Map>的ResultSetHandler实现类
     *               MapHandler 将ResultSet的首行转换为一个Map的ResultSetHandler实现类
     *               MapListHandler 将ResultSet转换为List<Map>的ResultSetHandler实现类
     *               ScalarHandler 将ResultSet的一个列到一个对象。
     * @param params 查询语句的参数
     * @return 查询结果集
     */
    public <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) {
        // 返回值
        T tRe = null;
        try {
            // 创建dbutils的查询处理类 QueryRunner的实例对象
            QueryRunner qr = new QueryRunner();
            // 使用queryrunner进行查询操作
            tRe = qr.query(conn, sql, rsh, params);
        } catch (SQLException e) {
            // DBUtils数据库查询操作异常
            System.out.println("DBUtils数据库查询操作异常:" + e.getMessage());
            e.printStackTrace();
        }
        // 返回结果集
        return tRe;
    }

    /**
     * DBUtils数据库新增、修改、删除操作
     *
     * @param conn   开启事务的数据库连接对象
     * @param sql    数据库新增、修改、删除操作语句
     * @param params 数据库新增、修改、删除操作语句的参数
     * @return 数据库新增、修改、删除操作所影响记录行数
     */
    public int update(Connection conn, String sql, Object... params) {
        // 返回值
        int iRe = 0;
        try {
            // 创建dbutils的更新处理类 QueryRunner的实例对象
            QueryRunner qr = new QueryRunner();
            // 使用queryrunner进行数据库新增、修改、删除操作
            iRe = qr.update(conn, sql, params);
        } catch (SQLException e) {
            // DBUtils数据库新增、修改、删除操作异常
            System.out.println("DBUtils数据库新增、修改、删除操作异常:" + e.getMessage());
            e.printStackTrace();
        }
        // 返回结果集
        return iRe;
    }

    /**
     * 获取驼峰命名的process
     *
     * @return RowProcessor
     */
    public static RowProcessor getProcess() {
        RowProcessor processor = new BasicRowProcessor(new GenerousBeanProcessor());
        return processor;
    }

    public String queryOne(String sql) {
        String queryBean = null;
        Connection con = null;
        PreparedStatement pst = null;
        ResultSet rs = null;
        try {
            con = DBSource.getConnection();

            pst = con.prepareStatement(sql);

            rs = pst.executeQuery();
            while (rs.next()) {
                queryBean = rs.getString(1);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBSource.close(con, pst, rs);
        }
        return queryBean;
    }

    public String queryOne(String sql, String... params) {
        int i = 0;
        while (sql.contains("&")) {
            sql = sql.replaceFirst("&", params[i]);
            i++;
        }
        return queryOne(sql);
    }
}
